//给定一个字符串 s 和一个整数 k，从字符串开头算起，每计数至 2k 个字符，就反转这 2k 字符中的前 k 个字符。 
//
// 
// 如果剩余字符少于 k 个，则将剩余字符全部反转。 
// 如果剩余字符小于 2k 但大于或等于 k 个，则反转前 k 个字符，其余字符保持原样。 
// 
//
// 
//
// 示例 1： 
//
// 
//输入：s = "abcdefg", k = 2
//输出："bacdfeg"
// 
//
// 示例 2： 
//
// 
//输入：s = "abcd", k = 2
//输出："bacd"
// 
//
// 
//
// 提示： 
//
// 
// 1 <= s.length <= 10⁴ 
// s 仅由小写英文组成 
// 1 <= k <= 10⁴ 
// 
// Related Topics 双指针 字符串 👍 268 👎 0

package leetcode.editor.cn;

class ReverseStringIi {
    public static void main(String[] args) {
        Solution solution = new ReverseStringIi().new Solution();
        solution.reverseStr("a", 2);
    }

    //leetcode submit region begin(Prohibit modification and deletion)
    class Solution {
    /*public String reverseStr(String s, int k) {
        char[] chars = s.toCharArray();
        int i;
        for (i = 0; i < s.length(); i += 2 * k) {
            if (i + k <= s.length()) {
                reverse(chars, i, i + k - 1);
                continue;
            }

            // 当最后小于k时，全部反转
            reverse(chars, i, s.length() - 1);
        }
        return String.valueOf(chars);
    }

    */

        /**
         * 反转函数
         *
         * @param chars
         * @param i
         * @param j
         * @return
         *//*
    public char[] reverse(char[] chars, int i, int j) {
        for (; i < j; i++, j--) {
            char temp = chars[i];
            chars[i] = chars[j];
            chars[j] = temp;
        }
        return chars;
    }*/
        /*public String reverseStr(String s, int k) {
            char[] array = s.toCharArray();
            int i = 0;
            for (; i < array.length; i += 2 * k) {
                if (i + k <= array.length) {
                    array = reverse(array, i, i + k - 1);
                    continue;
                }
                array = reverse(array, i, array.length - 1);
            }


            return new String(array);
        }

        public char[] reverse(char[] array, int left, int right) {
            for (; left < right; left++, right--) {
                char temp = array[left];
                array[left] = array[right];
                array[right] = temp;
            }
            return array;
        }*/
        public String reverseStr(String s, int k) {
            if (s == null || s.length() == 0) {
                return null;
            }

            char[] arr = s.toCharArray();
            int n = arr.length;
            for (int i = 0; i < n; i += 2 * k) {
                if (i + k <= n) {
                    reverse(arr, i, i + k - 1);
                } else {
                    reverse(arr, i, n - 1);
                }
            }

            return new String(arr);
        }

        public void reverse(char[] arr, int i, int j) {
            while (i < j) {
                char temp = arr[i];
                arr[i] = arr[j];
                arr[j] = temp;
                i++;
                j--;
            }
        }

    }
//leetcode submit region end(Prohibit modification and deletion)

}
